const strLit = 'Hello';
const strObj = new String('Hello');
console.log(strLit, typeof strLit); // 输出：Hello string
console.log(strObj, typeof strObj); // 输出：String { 'Hello' } object
console.log(strLit.toUpperCase()); // 输出：HELLO
console.log(strObj.valueOf(), typeof strObj.valueOf()); // 输出：Hello string
console.log(strLit instanceof String); // 输出：false
console.log(strObj instanceof String); // 输出：true
 
// 数字和布尔值的原始类型和包装对象
const numLit = 42;
const numObj = new Number(42);
console.log(numLit, typeof numLit); // 输出：42 number
console.log(numObj, typeof numObj); // 输出：Number { 42 } object
 
const boolLit = true;
const boolObj = new Boolean(true);
console.log(boolLit, typeof boolLit); // 输出：true boolean
console.log(boolObj, typeof boolObj); // 输出：Boolean { true } object
 
// 数组的字面量和构造函数的区别
const arrLit = [1, 2, 3];
const arrObj = new Array(1, 2, 3);
console.log(arrLit, typeof arrLit); // 输出：[1, 2, 3] object
console.log(arrObj, typeof arrObj); // 输出：[1, 2, 3] object
 
// 函数的字面量和构造函数的区别
function funcLit(x) {
    return x * x;
}
console.log(funcLit(5)); // 输出：25
console.log(typeof funcLit); // 输出：function
 
const funcObj = new Function('x', 'return x * x;');
console.log(funcObj(5)); // 输出：25
console.log(typeof funcObj); // 输出：function
 
// 对象字面量和构造函数的区别
const obj1 = {};
console.log(obj1, typeof obj1); // 输出：{} object
const obj2 = new Object();
console.log(obj2, typeof obj2); // 输出：{} object